闲谈神经网络--写给初学者(三)
接上篇。
前面两篇讲解了神经网络就是一个黑箱,里面有一个一个的小圆球(神经元)连接而成,通过改变神经元的连接方式及各个参数,就可以实现一个符合要求的神经网络。接下来我们来举一个BP神经网络的例子,以加深理解。
在讲解这个例子之前,大概说一下一个神经网络解决问题的思路:
1.对要解决的问题进行理解,找到输入输出数据。
2.把已知的输入输出数据分为两部分:一部分用来训练网络;另外一部分来验证训练的网络到底好不好用。
3.对输入数据进行预处理及归一化处理。
4.创建合适的网络,如BP、感知器、RBF、Hopfield等等。(其实是先建立一个神经网络的黑箱子)
5.设置网络训练参数,例如设置训练函数,学习函数、激活函数等等。
6.使用输入输出训练网络。(其实是把黑箱子里面的神经元的各个参数给训练和学习合适了)
7.使用验证数据验证网络。
8.验证后觉得网络还不错,就可以实际应用,在实际应用过程中,还可以再对模型进行优化、重构等等。
下面开始我们例子的说明,用一个传统的花分类的例子(http://en.wikipedia.org/wiki/Iris_flower_data_set ):大概意思是:给你一朵花的四个特征,神经网络输出它的品种(共有三个品种)。
所以每一个样本的输入:四个数据,代表花的四个特征;输出:一个数据,代表花的品种,分别为1,2,3代表三个不同的品种。
样本数据为:https://files.cnblogs.com/wuguanglei/%E6%95%B0%E6%8D%AE.rar
其中trainData.txt用作训练数据,testData.txt用作验证数据。Matlab程序代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
%0.操作前 clear; close all; clc; %1.读入训练数据 [f1,f2,f3,f4, class ] = textread( 'trainData.txt' , '%f%f%f%f%f' ,150); input=[f1,f2,f3,f4]';%神经网络是一列算做一个样本输入,因此矩阵要转置一下 output= class '; %2.输入数据归一化 [input,Se] = mapminmax(input) ; minI=Se.xmin; maxI=Se.xmax; %3.构造输出数据矩阵 s = length( class ) ;%输出为1,2,3,这用1 0 0表示1;0 1 0表示2;0 0 1表示3 output = zeros( 3, s ) ; for i = 1 : s output( class ( i ),i ) = 1 ; end %4.创建神经网络 net = newff( minmax(input) , [70 3] , { 'logsig' 'logsig' } , 'traingdx' ) ; %其中70表示第一层70个神经元,第二层30个神经元,后面几个参数分别设置的是激活函数和训练函数。 %5.设置训练参数 net.trainparam.show = 40 ; net.trainparam.epochs = 600 ; net.trainparam.goal = 0.01 ; net.trainParam.lr = 0.01 ; %6.开始训练 [net,tr,e] = train( net, input , output ) ; %7.测试网络 [t1 t2 t3 t4 c] = textread( 'testData.txt' , '%f%f%f%f%f' ,150); testInput=[t1,t2,t3,t4]'; testInput = mapminmax (testInput ) ; Y = sim( net , testInput ) ; %8.统计结果 [s1 , s2] = size( Y ) ; hitNum = 0 ; for i = 1 : s2 [m , Index] = max( Y( : , i ) ) if ( Index == c(i) ) hitNum = hitNum + 1 ; end end sprintf( '识别率是 %0.3f%%' ,100 * hitNum / s2 ) |
详细讲解看代码注释吧。
就先写到这儿吧,对于入门,应该够了。